/*
 * Copyright 2025 the original author or authors.
 * <p>
 * Licensed under the Moderne Source Available License (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * https://docs.moderne.io/licensing/moderne-source-available-license
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import {RecipeSpec} from "../../../src/test";

import {typescript} from "../../../src/javascript";

describe('yield mapping', () => {
    const spec = new RecipeSpec();

    test('simple', () =>
        spec.rewriteRun(
            //language=typescript
            typescript('function* generatorFunction() { yield 42;}')
        ));
    test('empty', () =>
        spec.rewriteRun(
            //language=typescript
            typescript('yield')
        ));
    test('delegated', () =>
        spec.rewriteRun(
            //language=typescript
            typescript('yield* other')
        ));

    test('yield expression', () =>
        spec.rewriteRun(
            //language=typescript
            typescript(`
                DenseMatrix.prototype[Symbol.iterator] = function* () {
                    const recurse = function* (value, index) {
                        if (isArray(value)) {
                            for (let i = 0; i < value.length; i++) {
                                yield* recurse(value[i], index.concat(i))
                            }
                        } else {
                            yield ({value, index})
                        }
                    }
                    yield/*a*/* /*b*/recurse(this._data, [])
                }
            `)
        ));
});
